package com.qiangesoft.design.behavioral.templatemethod;

/**
 * 模板方法模式
 */
public class Template {

    public static void main(String[] args) {
        // 京东
        Shopping shopping = new JdShopping();
        shopping.shop();

        System.out.println("--------------------------");

        // 淘宝
        Shopping shopping1 = new TbShopping();
        shopping1.shop();
    }
}

/**
 * 1.模板类
 * ps:购物功能
 */
abstract class Shopping {

    /**
     * 1.模板方法
     * ps:购物流程
     */
    public final void shop() {
        // 挑选
        select();
        // 下单
        order();
        // 支付
        boolean payFlag = pay();
        // 邮寄
        if (!payFlag) {
            return;
        }
        delivery();
        // 签收
        sign();
    }

    /**
     * 2.基本方法
     */

    /**
     * 2.1 具体方法
     */
    private void select() {
        System.out.println("挑选");
    }

    private void order() {
        System.out.println("下单");
    }

    private void sign() {
        System.out.println("签收");
    }

    /**
     * 2.1 抽象方法
     */
    abstract boolean pay();

    abstract void delivery();
}

/**
 * 2.具体子类
 */
// 京东购物
class JdShopping extends Shopping {

    @Override
    boolean pay() {
        System.out.println("支付：微信");
        return true;
    }

    @Override
    void delivery() {
        System.out.println("邮寄：京东快递");
    }
}

// 淘宝购物
class TbShopping extends Shopping {

    @Override
    boolean pay() {
        System.out.println("支付：支付宝");
        return true;
    }

    @Override
    void delivery() {
        System.out.println("邮寄：平台卖家安排快递");
    }
}